home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
uasm.zip
/
Z8SYM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1986-04-06
|
25KB
|
795 lines
/*
Custom Computer Consultants
Universal Cross Assembler
Z8 Symbols
5 April 1986
*/
#include <stdio.h>
#include <uasm.h>
char *version = {"Z8 Assembler -- V3.5 4/5/86\n"} ;
#define RSEG 0 /* Register Segment */
#define CSEG 1 /* Code Segment */
#define DSEG 2 /* Data Segment */
#define XSEG 3 /* External Data Segment */
#define ASCII 4 /* String */
#define PAGE 5 /* Page Eject */
#define RADIX 6 /* Define Radix */
#define REG 7 /* Register Address */
#define DB 8 /* Define Byte */
#define DS 9 /* Define Storage */
#define DW 10 /* Define Word */
#define EQU 11 /* Equate */
#define ORG 12 /* Origin */
extern int pass1 ;
extern int lbl ;
extern int i, j, k ;
extern int lnspp ;
extern int cc ;
extern int ilc ;
extern int active ;
extern int instl ;
extern int parval ;
extern int radix ;
extern int cput ;
extern int syte, sytx ;
extern unsigned unpar ;
extern unsigned ha, he, hsp ;
extern unsigned char ch ;
extern unsigned char sym ;
extern char *iptr ;
extern char segtype[] ;
extern unsigned char ib[] ;
extern unsigned char pv[] ;
extern unsigned char px[] ;
extern int pj[] ;
extern int il[] ;
extern char *pc[], *pseudo[] ;
extern int (*pp[])() ;
extern int (*ppo[])() ;
extern char ibuf[] ;
extern struct symbol symtab[] ;
#define SYMTYPE (symtab[sytx].flags&(NSEG-1))
code_seg() { return CSEG ; }
not_cseg(seg)
int seg ;
{
if( seg == RSEG || seg == DSEG ) return TRUE ;
else return FALSE ;
}
set_il()
{
il[RSEG] = 0 ;
il[CSEG] = 0 ;
il[DSEG] = 0 ;
il[XSEG] = 4096 ;
}
set_type()
{
segtype[RSEG] = '^' ;
segtype[CSEG] = '\'' ;
segtype[DSEG] = '\"' ;
segtype[XSEG] = '+' ;
}
amatch(s)
char *s ;
{
int tc ;
tc = cc - 1 ;
while( *s ) {
if( toupper(ch) != *s++ ) { iptr = &ibuf[cc=tc] ; getch() ;
return FALSE ;
}
getch() ;
}
return TRUE ;
}
gen(len)
int len ;
{
ib[2] = parval & 0xFF ;
ib[1] = len == 3 ? parval >> 8 : ib[2] ;
instl = len ;
ib[0] = pv[k] ;
return TRUE ;
}
isreg(r)
int r ;
{
return ((( r >= 0 ) && ( r <= 127 )) ||
(( r >= 240 ) && ( r <= 255 )) ) ;
}
iswreg(r)
int r ;
{
return (( r >= 0 ) && ( r <= 15 )) ;
}
nopr() { return gen(1) ; }
immd() { if( nomatch("#") ) return FALSE ;
parval = eval() ;
return gen(2) ; }
dreg() { parval = eval() ;
if (( SYMTYPE == RSEG ) && iswreg(parval)) parval |= 0xE0 ;
else if(( SYMTYPE == DSEG ) && isreg(parval)) ;
else push('M') ;
return gen(2) ; }
indr() { if( nomatch("@") ) return FALSE ;
return dreg() ; }
wreg() { parval = eval() ;
if ( SYMTYPE != RSEG ) return FALSE ;
if ( !iswreg(parval) ) return FALSE ;
ib[0] = (pv[k] + (parval << 4 )) ;
instl = 1 ;
return TRUE ; }
arith()
{
int dst, dt, src, st, mode, type, rc ;
dt = st = 1 ; /* Unrecognized */
mode = 4 ; /* Default R,R */
rc = TRUE ;
if( amatch("@") ) dt |= 4 ; /* Set Indirect Flag */
dst = eval() ; type = SYMTYPE ;
if( (( type == RSEG ) && iswreg(dst)) ||
(( type == DSEG ) && isreg(dst)) ) dt = (dt & ~1) | type ;
if( amatch(",#") ) {
src = eval() ;
st = 8 ;
}
else {
if( amatch(",@") ) st |= 4 ;
else if( notcomma() ) return FALSE ;
src = eval() ; type = SYMTYPE ;
if( (( type == RSEG ) && iswreg(src)) ||
(( type == DSEG ) && isreg(src)) ) st = (st & ~1) | type ;
}
switch ( dt*10+st ) {
case 0 : mode = 2 ;
goto ww ;
case 4 : mode = 3 ;
ww: parval = ( dst << 4 ) | src ;
instl = 2 ;
break ;
case 2 : dst |= 0xE0 ; goto rr ;
case 20 : src |= 0xE0 ; goto rr ;
case 22 : ;
rr: mode = 4 ;
parval = ( src << 8 ) + dst ;
instl = 3 ;
break ;
case 6 : dst |= 0xE0 ; goto rir ;
case 24 : src |= 0xE0 ; goto rir ;
case 26 : ;
rir: mode = 5 ;
parval = ( src << 8 ) + dst ;
instl = 3 ;
break ;
case 8 : dst |= 0xE0 ; goto rim ;
case 28 : ;
rim: mode = 6 ;
parval = ( dst << 8 ) + src ;
instl = 3 ;
break ;
case 48 : dst |= 0xE0 ; goto iim ;
case 68 : ;
iim: mode = 7 ;
parval = ( dst << 8 ) + src ;
instl = 3 ;
break ;
default : parval = ( src << 8 ) + dst ;
instl = 3 ;
rc = FALSE ;
}
gen(instl) ;
ib[0] |= mode ;
return rc ;
}
/* Destination Type Source Type
0 r r
2 R R
4 @r @r
6 @R @R
8 r(r) r(r)
A R(r) R(r)
C - #IM
*/
ldins()
{
int dst, dt, src, st, x, type ;
dt = st = 1 ; /* Unrecognized */
if( amatch("@") ) dt = dt | 4 ;
dst = eval() ; type = SYMTYPE ;
if( (( type == RSEG ) && iswreg(dst)) ||
(( type == DSEG ) && isreg(dst)) ) dt = (dt & ~1) | type ;
if( amatch("(") ) {
x = eval() ; type = SYMTYPE ;
if(( type == RSEG ) && iswreg(x) ) dt = dt | 8 ;
if( nomatch(")") ) return FALSE ;
}
if( notcomma() ) return FALSE ;
if( amatch("#") ) { src = eval() ; st = 12 ; }
else {
if( amatch("@") ) st = st | 4 ;
src = eval() ; type = SYMTYPE ;
if( (( type == RSEG ) && iswreg(src)) ||
(( type == DSEG ) && isreg(src)) ) st = (st & ~1) | type ;
if( amatch("(") ) {
x = eval() ; type = SYMTYPE ;
if(( type == RSEG ) && iswreg(x) ) st = st | 8 ;
if( nomatch(")") ) return FALSE ;
}
}
switch( dt * 16 + st ) {
/* 00 - r,r */
case 0 : ib[instl++] = ( dst << 4 ) + 0x08 ;
ib[instl++] = src + 0xE0 ; return TRUE ;
/* 02 - r,R */
case 2 : ib[instl++] = ( dst << 4 ) + 0x08 ;
ib[instl++] = src ; return TRUE ;
/* 04 - r,@r */
case 4 : ib[instl++] = 0xE3 ;
ib[instl++] = ( dst << 4 ) + src ; return TRUE ;
/* 06 - r,@R */
case 6 : ib[instl++] = 0xE5 ;
ib[i